package 剑指offer_专项突击版.中等;

import 分类.滑动窗口;

/**
 * 给定一个正整数数组 nums和整数 k ，请找出该数组内乘积小于 k 的连续的子数组的个数。
 * <p>
 *  
 * <p>
 * 示例 1:
 * <p>
 * 输入: nums = [10,5,2,6], k = 100
 * 输出: 8
 * 解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。
 * 需要注意的是 [10,5,2] 并不是乘积小于100的子数组。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/ZVAVXX
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author caihe
 * @date 2022/11/3 9:01
 */
public class _009乘积小于K的子数组 implements 滑动窗口 {
    public static void main(String[] args) {
        _009乘积小于K的子数组 a = new _009乘积小于K的子数组();
        a.numSubarrayProductLessThanK(new int[]{1,2,3}, 0);
        
    }

    public int numSubarrayProductLessThanK(int[] nums, int k) {
        int left = 0, right = 0;
        int min = 1;
        int res = 0;
        while (right < nums.length) {
            min *= nums[right];
            while (min >= k && left < right) {
                min /= nums[left];
                left++;
            }
            if (min < k) {
                // 每次记录右到左的所有情况
                res += right - left + 1;    
            }
            
            right++;
        }
        return res;
    }

}
